package com.mazaiting.manager.controller;


import com.mazaiting.common.core.domain.result.Option;
import com.mazaiting.common.core.ex.exceptions.BaseException;
import com.mazaiting.common.core.ex.exceptions.EmptyObjectException;
import com.mazaiting.manager.domain.form.MenuForm;
import com.mazaiting.manager.domain.query.MenuQueryParam;
import com.mazaiting.manager.domain.vo.menu.MenuDetailVO;
import com.mazaiting.manager.domain.vo.menu.MenuVO;
import com.mazaiting.manager.domain.vo.menu.ResourceVO;
import com.mazaiting.manager.domain.vo.menu.RouteVO;
import com.mazaiting.manager.service.ISysMenuService;
import com.mazaiting.web.auth.security.annotation.PrePermission;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 菜单控制器
 *
 * @author mazaiting
 * @since 2022-09-19
 */
@Slf4j
@RestController
@RequestMapping("manager/v1/menus")
@RequiredArgsConstructor
public class SysMenuController {

    private final ISysMenuService sysMenuService;

    /**
     * 路由列表
     *
     * @return 路由列表
     */
    @GetMapping("routes")
    public List<RouteVO> listRoutes() throws EmptyObjectException {
        return sysMenuService.listRoutes();
    }

    /**
     * 资源(菜单+权限)列表
     *
     * @return 资源(菜单 + 权限)列表
     */
    @PrePermission("sys:menu:query")
    @GetMapping("/resources")
    public List<ResourceVO> listResources() {
        return sysMenuService.listResources();
    }

    /**
     * 菜单列表
     *
     * @param queryParam 查询参数
     * @return 菜单列表
     */
    @PrePermission("sys:menu:query")
    @GetMapping
    public List<MenuVO> listMenus(MenuQueryParam queryParam) {
        return sysMenuService.listMenus(queryParam);
    }

    /**
     * 菜单下拉列表
     *
     * @return 菜单下拉列表
     */
    @GetMapping("/options")
    public List<Option<Long>> listMenuOptions() {
        return sysMenuService.listMenuOptions();
    }

    /**
     * 菜单详情
     * @param menuId 菜单 ID
     * @return 菜单详情
     */
    @PrePermission("sys:menu:update")
    @GetMapping("/{menuId}")
    public MenuDetailVO detail(@PathVariable Long menuId) throws EmptyObjectException {
        return sysMenuService.findById(menuId);
    }

    /**
     * 新增菜单
     * @param menuForm 菜单表单数据
     * @return true: 新增成功; false: 新增失败
     */
    @PrePermission("sys:menu:add")
    @PostMapping
    public boolean add(MenuForm menuForm) throws BaseException {
        return sysMenuService.save(menuForm);
    }

    /**
     * 修改菜单
     * @param menuForm 菜单表单数据
     * @return true: 修改成功; false: 修改失败
     */
    @PrePermission("sys:menu:update")
    @PutMapping
    public boolean update(MenuForm menuForm) throws BaseException {
        return sysMenuService.update(menuForm);
    }

    /**
     * 删除菜单
     * @param ids 菜单ID, 多个以英文(,)分割
     * @return true: 删除成功; false: 删除失败
     */
    @PrePermission("sys:menu:delete")
    @DeleteMapping("/{ids}")
    public boolean deleteByIds(@PathVariable("ids") String ids) {
        return sysMenuService.deleteByIds(ids);
    }
}
